/* Includes -------------------------------------------------------------------------------------*/
#include <MyProject.h>
PFCValue  PFCSet;

/*注意事项：
1.GetPFCCurrentOffset()函数运放3偏置的AD口要对上；
2.PFC_ADCCH寄存器电流采样通道要匹配上；
3.母线电压用AD2；
4.对应AD口使能，对应运放使能。
*/

//const int16 CURRENTLOOP_KP[128]=
//{
// _Q10(1.50),_Q10(1.50),_Q10(1.50),_Q10(1.50),_Q10(1.50),_Q10(1.50),_Q10(1.50),_Q10(1.50),_Q10(1.50),_Q10(1.50),
// _Q10(1.45),_Q10(1.45),_Q10(1.40),_Q10(1.40),_Q10(1.35),_Q10(1.35),_Q10(1.30),_Q10(1.30),_Q10(1.25),_Q10(1.25),
// _Q10(1.20),_Q10(1.20),_Q10(1.15),_Q10(1.15),_Q10(1.10),_Q10(1.10),_Q10(1.05),_Q10(1.05),_Q10(1.00),_Q10(1.00),
// _Q10(0.99),_Q10(0.99),_Q10(0.98),_Q10(0.98),_Q10(0.97),_Q10(0.97),_Q10(0.96),_Q10(0.96),_Q10(0.95),_Q10(0.95),
// _Q10(0.94),_Q10(0.94),_Q10(0.93),_Q10(0.93),_Q10(0.92),_Q10(0.92),_Q10(0.91),_Q10(0.91),_Q10(0.90),_Q10(0.90),
// _Q10(0.89),_Q10(0.89),_Q10(0.88),_Q10(0.88),_Q10(0.87),_Q10(0.87),_Q10(0.86),_Q10(0.86),_Q10(0.85),_Q10(0.85),
// _Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),
// _Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),
// _Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),
// _Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),
// _Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),
// _Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80),_Q10(0.80)
//};

//const int16 CURRENTLOOP_KI[128]=
//{
//  _Q15(0.544),_Q15(0.544),_Q15(0.544),_Q15(0.544),_Q15(0.544),_Q15(0.544),_Q15(0.544),_Q15(0.544),_Q15(0.544),_Q15(0.544),
//  _Q15(0.534),_Q15(0.524),_Q15(0.514),_Q15(0.504),_Q15(0.494),_Q15(0.484),_Q15(0.474),_Q15(0.464),_Q15(0.454),_Q15(0.434),
//  _Q15(0.424),_Q15(0.414),_Q15(0.404),_Q15(0.394),_Q15(0.384),_Q15(0.374),_Q15(0.364),_Q15(0.354),_Q15(0.344),_Q15(0.334),
//  _Q15(0.317),_Q15(0.305),_Q15(0.300),_Q15(0.295),_Q15(0.290),_Q15(0.285),_Q15(0.280),_Q15(0.275),_Q15(0.270),_Q15(0.265),
//  _Q15(0.260),_Q15(0.259),_Q15(0.259),_Q15(0.258),_Q15(0.258),_Q15(0.257),_Q15(0.257),_Q15(0.256),_Q15(0.256),_Q15(0.255),
//  _Q15(0.255),_Q15(0.250),_Q15(0.250),_Q15(0.245),_Q15(0.245),_Q15(0.240),_Q15(0.240),_Q15(0.235),_Q15(0.235),_Q15(0.225),
//  _Q15(0.220),_Q15(0.210),_Q15(0.205),_Q15(0.200),_Q15(0.195),_Q15(0.190),_Q15(0.185),_Q15(0.180),_Q15(0.175),_Q15(0.170),
//  _Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),
//  _Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),
//  _Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),
//  _Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),
//  _Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),
//  _Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160),_Q15(0.160)

//};

void PFC_init(void)
{
    int8 UAC_N1;
    UDC_REF      = _Q15(330.0 / HW_BOARD_VOLT_MAX);//0x00;        // PFC_UDCREF;  // udc的参考值
    UDC__UK      = 0x00;        // 外环PI的输出
    UDC_KP       = PFC_UKP;     // 外环KP
    UDC_KI       = PFC_UKI;     // 外环KI
    UDC_UKMAX    = 0x00;        // 外环输出最大值
	  UDC_UKMIN    = 0x00;
    IAC__REF     = 0x00;        // PFC模式时，不需要设置，由外环PI乘以Uac得到ref值
    IAC__UK      = 0x00;        // 内环PI的输出
    IAC_KP       = PFC_IKP;     // 内环KP
    IAC_KI       = PFC_IKI;     // 内环KI
    IAC_UKMAX    = 0x00;        // 最大7fff对应输出100%占空比，调试时别设太大，防止爆炸
    PFC_ARR      = PFCPWM_ARR;  // 周期值
    PFC_KM       = 3;           // Km的值
    /*-------------------------------------------------------------------------------------------------
    UAC采样分频设置
    00: 不分频  01: 2分频  10: 4分频  11: 8分频
    -------------------------------------------------------------------------------------------------*/
    #if (SAMPLEFREQ==SAMPLEDIV0)
    ClrBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0);
    #elif (SAMPLEFREQ==SAMPLEDIV2)
    SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL0) ;
    #elif (SAMPLEFREQ==SAMPLEDIV4)
    SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL1);
    #elif (SAMPLEFREQ==SAMPLEDIV8)
    SetBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0);
    #endif
    /*-------------------------------------------------------------------------------------------------
    UTHR  0: 1/16的UACMAX  1: 1/8的UACMAX
    -------------------------------------------------------------------------------------------------*/
    SetBit(PFC_CR1, UTHR);
    //    ClrBit(PFC_CR1, UTHR);
    PFC_OUTARR   = 200;        // 电压环的执行频率=PFC载波频率/OUTARR
    PFC_ADCCH    = 0xC3;       // 高4位：iac的ADC12通道  低4位：uac的ADC11通道    //6815板子Uac为AD3
    PFC_CSO      = 0x0000;     // 电流基准
    PFC_TRGDLY  &= 0x0B;
    PFC_TRGDLY  |= 0x00;       // 采样delay设置，只写高4位，低4位默认写0，如0xX0,X的范围为:0-F
    UAC_N1 = UAC_N;
    
    if (UAC_N1 > 31)
    { PFC_CR1     |= 0x1F; }       // UAC采样次数0x1f
    else
    { PFC_CR1     |= UAC_N; }      // UAC采样次数
    
    //    SetBit(PFC_CR0, UAVGCDIS);// PFC硬件自动算UAVG禁止
		ClrBit(PFC_CR0, UAVGCDIS);
		
    #if (PFCOverCurrentProtectEnable)
    //SetBit(PFC_CR0, PFCOA);    // PFC逐步限流恢复使能
    #endif
    SetBit(PFC_CR0, PFCEN);    // PFC使能
//    PFC_CR2     |= 3 << 6;      //00：1倍死区   01:1/2   10： 2倍  11：不使能   //灯泡负载不加死区，电机负载加死区
//    PFC_CR2     |= 1 << 5;      //在大于50％的地方采样，0：使能 1：不使能
		 SetBit(PFC_CR2,PFC_BLK_MD1);
		 SetBit(PFC_CR2,PFC_BLK_MD0);
		 ClrBit(PFC_CR2,P2FTEN);
    //限流滤波选择
    #if (PFCOverCurrentProtectEnable)
    CMP5_Init();
    #endif
    /****参数初始化*******/
    PFCSet.IacOffset    = 0;
    PFCSet.IacOffsetSum = 0;
    PFCSet.OffsetCount  = 0;
    PFCSet.OffsetFlag   = 0;
    PFCSet.UDCREFValue  = 0;
    PFCSet.IACOUTMax    = 0;
    PFCSet.UacavgCnt    = 0;
    PFCSet.OverVoltFlag = 0;
    PFCSet.UDCOUTMax    = PFC_UDCREF;
    PFCSet.UacMaxCnt    = 0;
		
		PFCSet.IacOffsetSamplingDelay = 250;
}
/*---------------------------------------------------------------------------*/
/* Name     :   void GetPFCCurrentOffset(void)
/* Input    :   NO
/* Output   :   NO
/* Description: 上电时，先对PFC的AC电流进行校准。即先采集AC电流,时间不是固定。
/*---------------------------------------------------------------------------*/
void GetPFCCurrentOffset(void)
{
    if (PFCSet.OffsetFlag == 0)
    {
      
			  if(PFCSet.IacOffsetSamplingDelay == 0)
        {
					  if (PFC__UAC < (mcFocCtrl.mcDcbusFlt - _Q15(7.0 / HW_BOARD_VOLT_MAX)))
						{
					
            SetBit(ADC_CR, ADCBSY);                                // 使能ADC
            
            while (ReadBit(ADC_CR, ADCBSY));
            
            PFCSet.IacOffsetSum += (ADC12_DR);
            PFCSet.IacOffset     = PFCSet.IacOffsetSum >> 4;
            PFCSet.IacOffsetSum -= PFCSet.IacOffset;
            
            if (PFCSet.OffsetCount < 2000)
            { 
							
							PFCSet.OffsetCount++; 
						
            }
            else
            {
							
                if ((PFCSet.IacOffset > 15900) && (PFCSet.IacOffset < 16700)) //偏置在正常范围内
                {
                    PFCSet.OffsetFlag = 1;
                    PFC_CSO  = PFCSet.IacOffset;
                    
//                    if (mcFocCtrl.mcDcbusFlt < (PFC_UDCREF - _Q15(10.0 / HW_BOARD_ACVOLT_MAX)))
//                    {
//                        UDC_REF     = mcFocCtrl.mcDcbusFlt + _Q15(10.0 / HW_BOARD_ACVOLT_MAX);
//                    }
//                    else
//                    {
//                        UDC_REF     = PFC_UDCREF;
//                    }
                    
                    UDC__UK     = 0x0001;
                    IAC__REF    = 0x0001;
                    UDC_UKMAX   = PFC_UOUTMAX; // 外环输出最大值
                    IAC_UKMAX   = _Q15(0.1);   // 最大7fff对应输出100%占空比，调试时别设太大，防止爆炸
                    //              SetBit(PFC_CR0, PFCEN);    // PFC使能
                    SetBit(PFC_CR0, PFCOE);    // PFC输出使能
									 
									  
                }
                else
                {
                    mcFaultSource = FaultPFCOffset;   //偏置错误
                    ClrBit(PFC_CR0, PFCOE);    // PFC输出使能
                }
            }
					}
        }
    }
}

void  PFCRunResponse(void)
{
	  int16 IAC_KP_Temp  = 0;     // 内环KP
		int16 IAC_KI_Temp  = 0;     // 内环KI
    if (PFCSet.OffsetFlag == 1)
    {
        /******高电压时PFC电压抬高，给定目标电压小于母线电压时，自动抬高，目前不用，设定给定电压不要小于母线电压即可*******/
        //           if(PFCSet.UacMaxCnt > 20)
        //           {
        //             if((PFCSet.UacMax > PFC_ACMAX) && (mcFocCtrl.mcDcbusFlt <= (PFCSet.UDCOUTMax + _Q15(10.0 / HW_BOARD_VOLT_MAX))))
        //             {
        
        //                PFCSet.UacDec = PFCSet.UacMax - PFC_ACMAX;
        //                if(PFCSet.UacDec > _Q15(20.0 / HW_BOARD_VOLT_MAX))
        //                {
        //                  PFCSet.UacDec = _Q15(20.0 / HW_BOARD_VOLT_MAX);
        //                }
        //                PFCSet.UDCOUTMax = PFC_UDCREF+PFCSet.UacDec;
        //             }
        //             else
        //             {
        //                PFCSet.UDCOUTMax = PFC_UDCREF;
        //             }
        //              if(PFCSet.IacMaxCnt > 20)
        //              {
        //                 PFCSet.IacRefMax=0;
        //                 PFCSet.IacMaxCnt=0;
        //              }
        //              else
        //              {
        //                  PFCSet.IacMaxCnt++;
        //              }
        //              PFCSet.UacMax=0;
        //              PFCSet.UacMaxCnt=0;
        //           }
        //           else
        //           {
        //               PFCSet.UacMaxCnt++;
        //           }
        
        /*****给定电压爬坡***********/
        //          if(UDC_REF<PFCSet.UDCOUTMax)
        if (UDC_REF < PFC_UDCREF)
        {
            PFCSet.UDCREFValue = UDC_REF;
            PFCSet.UDCREFValue += PFC_UDCREFINC;
            UDC_REF     = PFCSet.UDCREFValue;
        }
        else
            //              UDC_REF=PFCSet.UDCOUTMax;
        { UDC_REF = PFC_UDCREF; }
        
				
				if (mcFocCtrl.Power_Currt < 500)
				{
					PFCSet. KmSetValue_add = 50;
					PFC_IKI_RUN_Temp = PFC_IKI;
					PFC_IKP_RUN_Temp = PFC_IKP;
				}
				else if (mcFocCtrl.Power_Currt < 1000)
				{
					PFCSet. KmSetValue_add = 50;
					PFC_IKI_RUN_Temp = PFC_IKI1;
					PFC_IKP_RUN_Temp = PFC_IKP1;
				}
				else if (mcFocCtrl.Power_Currt < 2000)
				{
					PFCSet. KmSetValue_add = 50;
					PFC_IKI_RUN_Temp = PFC_IKI2;
					PFC_IKP_RUN_Temp = PFC_IKP2;
				}
				else
				{
					PFCSet. KmSetValue_add = 50;
					PFC_IKI_RUN_Temp = PFC_IKI3;
					PFC_IKP_RUN_Temp = PFC_IKP3;
				}
				PFCSet.PFCKMREFValue=PFC_KM;
        if(PFCSet.PFCKMREFValue < (KmSetValue + PFCSet.KmSetValue_add ))
          {
              PFCSet.PFCKMREFValue++;
              PFC_KM     =PFCSet.PFCKMREFValue;
          }
					else if(PFCSet.PFCKMREFValue > (KmSetValue + PFCSet.KmSetValue_add ))
					{
					    
              PFCSet.PFCKMREFValue--;
              PFC_KM     =PFCSet.PFCKMREFValue;
						
					}
        
        /******电流输出能力爬坡******/
        if (IAC_UKMAX < PFC_IOUTMAX)
        {
            PFCSet.IACOUTMax = IAC_UKMAX;
            PFCSet.IACOUTMax += PFC_OUTINC;
            IAC_UKMAX       = PFCSet.IACOUTMax;
        }
        else
        {
            IAC_UKMAX = PFC_IOUTMAX;
        }
				
				
			 
				
				       IAC_KP_Temp = IAC_KP;
								if(IAC_KP_Temp < (PFC_IKP_RUN_Temp - 2))
								{
									IAC_KP_Temp = IAC_KP_Temp + 2;
									IAC_KP = IAC_KP_Temp;
								}
								else if(IAC_KP_Temp > (PFC_IKP_RUN_Temp + 2))
								{
									IAC_KP_Temp = IAC_KP_Temp - 2;
									IAC_KP = IAC_KP_Temp;
								}
								else
								{
									IAC_KP = PFC_IKP_RUN_Temp;
								}
								
								IAC_KI_Temp = IAC_KI;
								if(IAC_KI_Temp < (PFC_IKI_RUN_Temp - 20))
								{
									IAC_KI_Temp = IAC_KI_Temp + 20;
									IAC_KI = IAC_KI_Temp;
								}else if(IAC_KI_Temp > (PFC_IKI_RUN_Temp + 20))
								{
									IAC_KI_Temp = IAC_KI_Temp - 20;
									IAC_KI = IAC_KI_Temp;
								}else
								{
									IAC_KI = PFC_IKI_RUN_Temp;
								}
    }
}
/**********************
/* Name     :   void PFCVoltageRespone(void)
/* Input    :   NO
/* Output   :   NO
/* Description: 解决电压过冲的问题
*****************************************/
void  PFCVoltageRespone(void)
{
    //         PFCSet.UacavgCnt    ++;
    //        if(PFCSet.UacavgCnt >=100)
    //         {
    //           PFCSet.UacavgCnt=0;
    //           SetBit(PFC_CR0, UAVGCSW);
    //         }
    //
    
    //求Uac电压最大值
    if (PFC__UAC > PFCSet.UacMax)
    {
        PFCSet.UacMax = PFC__UAC;
    }
    
    if (IAC__REF > PFCSet.IacRefMax)
    {
        if ((IAC__REF < 32767) && (IAC__REF > 0))
        {
            PFCSet.IacRefMax = IAC__REF;
        }
    }
    
    //PFC过压保护
    if (FOC__UDCFLT  > PFC_VOLTAGEPROTECT)           //保护
    {
        ClrBit(PFC_CR0, PFCOE);                       // PFC输出关闭
        mcFaultSource = FaultPFC;                     // 保护
        PFCSet.OverVoltFlag = 1;
    }
//		
		if (FOC__UDCFLT > _Q15(310.0 / HW_BOARD_VOLT_MAX))
		{
			PFCSet.PFCflag =1;
			PFCSet.UnderVoltFlag = 0;
		}
		
		if (PFCSet.PFCflag ==1)
		{
			if (FOC__UDCFLT < _Q15(80.0 / HW_BOARD_VOLT_MAX))
			{
				ClrBit(PFC_CR0, PFCOE);                       // PFC输出关闭
        //mcFaultSource = FaultUnderVoltage;
				PFCSet.PFCflag = 0;
				PFCSet.UnderVoltFlag = 1;				
				GP36 = 0;
			}
		}
////		
    
    #if (PFC_VOLTAGEPRO_RECOVEREN)                 //保护恢复
    {
//        if ((mcFaultSource == FaultPFC)|| && (mcState == mcFault) 
//					&& (FOC__UDCFLT < PFC_VOLTAGEPROTECT_RECOVER))
		if ((mcState == mcFault) && ((mcFaultSource == FaultPFC) || (mcFaultSource == FaultUnderVoltage)))
		{
			if ((mcFocCtrl.mcDcbusFlt < PFC_VOLTAGEPROTECT_RECOVER) && (mcFocCtrl.mcDcbusFlt > UNDER_RECOVER_VALUE))
			{
        {
            mcFaultSource      = FaultNoSource ;
            PFC_init();
            PFCSet.OverVoltFlag = 0;
					  PFCSet.UnderVoltFlag = 0;
					  
        }
			}
    }
	}
    #endif
}
